home *** CD-ROM | disk | FTP | other *** search
/ CD ROM Paradise Collection 4 / CD ROM Paradise Collection 4 1995 Nov.iso / program / swagd_f.zip / EGAVGA.SWG / 0141_256 Color 320x200 BMP Loader.pas < prev    next >
Pascal/Delphi Source File  |  1995-03-03  |  2KB  |  96 lines

  1. {
  2.    320x200x256c BMP loader
  3.    written by:
  4.  .--------- Simon R Bowser ------- aka Pinrut -----------.
  5.  |  Department of Computer Science, Aberdeen University  |
  6.  |            E-Mail: u04srb@abdn.ac.uk                  |
  7.  |     Simon.Bowser@launchpad.unc.edu  |
  8.  `-------------------------------------------------------'
  9.   This code if FREEWARE, do with it as you will.
  10.  
  11.   note: this ONLY works for 320x200 images
  12. }
  13.  
  14. Procedure LoadBMP(Name:String;where:word);
  15. type
  16.      Virtual = Array [1..64000] of byte;
  17. VAR
  18.    PicBuf: ^Virtual;
  19.  
  20.    Data:File;
  21.    RGB:ARRAY[0..255,1..4] OF Byte;
  22.    Header:Array[1..54] of Byte;
  23.    aAddr :word;
  24.  
  25.    I:Byte;
  26.    {x,y:integer;}
  27.  
  28.   Procedure SetPal(Col,R,G,B : Byte); assembler;
  29.     asm
  30.       mov    dx,3c8h
  31.       mov    al,[col]
  32.       out    dx,al
  33.       inc    dx
  34.       mov    al,[r]
  35.       out    dx,al
  36.       mov    al,[g]
  37.       out    dx,al
  38.       mov    al,[b]
  39.       out    dx,al
  40.   end;
  41.  
  42. BEGIN
  43.      GetMem (PicBuf,64000);
  44.      Assign(Data,Name); Reset(Data,1);
  45.      BlockRead(Data,Header,54);                 { read and ignore :) }
  46.      BlockRead(Data,RGB,1024);                  { pal info }
  47.      FOR I:=0 TO 255 DO
  48.   SetPal(I,RGB[I,3] div 4,RGB[I,2] div 4,RGB[I,1] div 4);
  49.      BlockRead(Data,PicBuf^,64000);
  50.      Close(Data);
  51.      aAddr := seg (PicBuf^);
  52.  
  53.   asm                    {AMS routine 2.7 times faster than Pascal one!}
  54.      push si             {wibble, wobble ;) }
  55.      push di             {I'm no ASM, programmer so there MUST me room}
  56.      push es             {for optimisation}
  57.      push ds
  58.      mov es, [where]
  59.      mov ds, [aAddr]
  60.      mov di, 0
  61.      mov dx, 63680
  62.      mov cx, 200
  63.   @page:
  64.      push cx
  65.      mov cx, 320
  66.      mov si, dx
  67.   @line:
  68.      mov bh, byte ptr ds:[si]
  69.      mov es:[di], bh
  70.      inc di
  71.      inc si
  72.      loop @line
  73.      sub dx, 320
  74.      pop cx
  75.      loop @page
  76.      pop ds
  77.      pop es
  78.      pop di
  79.      pop si
  80.   end;
  81.  
  82. {    for y:=0 to 199 do
  83.       for x:=0 to 319 do
  84.  Mem[where:y*320+x] := Mem[aAddr:(199-y)*320+x];}
  85.  
  86.   FreeMem(PicBuf,64000);
  87. END;
  88.  
  89. begin
  90.   asm mov        ax,0013h;int        10h; end;      { set MCGA }
  91.   LoadBMP('whatever.bmp',$A000);
  92.  
  93.   { repeat until keypressed;  (use crt) }
  94. end.
  95.  
  96.